vulkan: Optimize getting textures
authorBenjamin Otte <otte@redhat.com>
Sat, 31 Dec 2016 21:58:15 +0000 (22:58 +0100)
committerBenjamin Otte <otte@redhat.com>
Sun, 1 Jan 2017 18:53:36 +0000 (19:53 +0100)
When we already have a texture or know we need to upload, just do that
instead of rendering to Cairo.

gsk/gskvulkanrenderpass.c

index b9136bce4ec84986beb0ff17b32dcfefafb81b2c..68b9e48dc70b56fa0ed5da5eb11c179b2468ac5f 100644 (file)
@@ -324,6 +324,23 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass   *self,
   cairo_surface_t *surface;
   cairo_t *cr;
 
+  if (graphene_rect_equal (bounds, &node->bounds))
+    {
+      switch (gsk_render_node_get_node_type (node))
+        {
+        case GSK_TEXTURE_NODE:
+          return gsk_vulkan_renderer_ref_texture_image (GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
+                                                        gsk_texture_node_get_texture (node),
+                                                        uploader);
+        case GSK_CAIRO_NODE:
+          surface = cairo_surface_reference (gsk_cairo_node_get_surface (node));
+          goto got_surface;
+
+        default:
+          break;
+        }
+    }
+
   /* XXX: We could intersect bounds with clip bounds here */
   surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
                                         ceil (bounds->size.width),
@@ -335,6 +352,7 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass   *self,
 
   cairo_destroy (cr);
 
+got_surface:
   result = gsk_vulkan_image_new_from_data (uploader,
                                            cairo_image_surface_get_data (surface),
                                            cairo_image_surface_get_width (surface),